﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;
using Microsoft.Reporting.WinForms;

namespace MiraPark
{
    public partial class FormCadastroTipoColisao : Form
    {
        private string operacao = "";

        public FormCadastroTipoColisao()
        {
            InitializeComponent();
        }

        private void FormCadastroTipoColisao_Load(object sender, EventArgs e)
        {
            //Popular a lista de tipos de colisões cadastrados
            this.dataGridViewTipoColisoes.DataSource = ModelBO.getTipoColisoes();
            setupButtonsControls();
        }

        private void dataGridViewColisao_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            List<TipoColisaoVO> tipoList = (List<TipoColisaoVO>)this.dataGridViewTipoColisoes.DataSource;
            TipoColisaoVO tipo = tipoList[this.dataGridViewTipoColisoes.CurrentRow.Index];

            if (!ModelBO.readyToDeleteTipoColisao(tipo.idTipoColisao))
            {
                MessageBox.Show(this, "Tipo de colisão não pode ser excluído pois já está associado a Veículos", "Aviso");
                return;
            }

            this.operacao = "excluir";

            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do tipo de colisão " + tipo.colisao, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.delTipoColisao(tipo);

                int nRow = this.dataGridViewTipoColisoes.CurrentRow.Index;
                this.dataGridViewTipoColisoes.DataSource = ModelBO.getTipoColisoes();
                if (this.dataGridViewTipoColisoes.Rows.Count > 0)
                {
                    dataGridViewTipoColisoes.CurrentCell = dataGridViewTipoColisoes.Rows[Math.Min(nRow, this.dataGridViewTipoColisoes.Rows.Count - 1)].Cells[1];
                    dataGridViewTipoColisoes.Rows[Math.Min(nRow, this.dataGridViewTipoColisoes.Rows.Count) - 1].Selected = true;
                }
                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.textBoxColisao.Text.Trim().Length == 0)
                erros = erros + "Nome de colisão deve ser informado.\r\n";
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            TipoColisaoVO tipo = null;

            if (this.operacao.Equals("novo"))
            {

                tipo = TipoColisaoVO.CreateTipoColisaoVO();
                tipo.colisao = this.textBoxColisao.Text;
                tipo.permitido = this.checkBoxPermitido.Checked;
                tipo.avariaX = this.ovalShape1.Location.X;
                tipo.avariaY = this.ovalShape1.Location.Y;
                tipo.avariaWidth = this.ovalShape1.Width;
                tipo.avariaHeight = this.ovalShape1.Height;

                tipo.idTipoColisao = (int)ModelBO.newTipoColisao(tipo);
            }
            if (this.operacao.Equals("editar"))
            {
                List<TipoColisaoVO> tipoList = (List<TipoColisaoVO>)this.dataGridViewTipoColisoes.DataSource;
                tipo = tipoList[this.dataGridViewTipoColisoes.CurrentRow.Index];

                tipo.colisao = this.textBoxColisao.Text;
                tipo.permitido = this.checkBoxPermitido.Checked;
                tipo.avariaX = this.ovalShape1.Location.X;
                tipo.avariaY = this.ovalShape1.Location.Y;
                tipo.avariaWidth = this.ovalShape1.Width;
                tipo.avariaHeight = this.ovalShape1.Height;

                ModelBO.setTipoColisao(tipo);
            }
            this.operacao = "salvar";

            List<TipoColisaoVO> listTipoColisaoVOs = ModelBO.getTipoColisoes();
            dataGridViewTipoColisoes.DataSource = listTipoColisaoVOs;
            int nRow = listTipoColisaoVOs.FindIndex(a => a.idTipoColisao == tipo.idTipoColisao);
            dataGridViewTipoColisoes.CurrentCell = dataGridViewTipoColisoes.Rows[nRow].Cells[1];
            dataGridViewTipoColisoes.Rows[nRow].Selected = true;

            setupButtonsControls();
        }

        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewTipoColisoes.Rows.Count > 0 && this.dataGridViewTipoColisoes.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.textBoxColisao.Enabled = novo || edit;
            this.checkBoxPermitido.Enabled = novo || edit;

            this.trackBarY.Enabled = novo || edit;
            this.trackBarX.Enabled = novo || edit;
            this.buttonAumentar.Enabled = novo || edit;
            this.buttonDiminuir.Enabled = novo || edit;
            this.buttonEncolherBaixo.Enabled = novo || edit;
            this.buttonEncolherDir.Enabled = novo || edit;
            this.buttonEsticarBaixo.Enabled = novo || edit;
            this.buttonEsticarDir.Enabled = novo || edit;

            this.dataGridViewTipoColisoes.Enabled = !novo && !edit;

            if (!haRows || novo)
            {
                this.textBoxId.Text = "";
                this.textBoxColisao.Text = "";
                this.checkBoxPermitido.Checked = false;
                this.trackBarY.Value = this.trackBarY.Maximum;
                this.trackBarX.Value = 0;
                this.ovalShape1.Top = 0;
                this.ovalShape1.Left = 0;
                this.ovalShape1.Width = 50;
                this.ovalShape1.Height = 50;
            }
            else {
                List<TipoColisaoVO> tipoList = (List<TipoColisaoVO>)this.dataGridViewTipoColisoes.DataSource;
                TipoColisaoVO tipo = tipoList[this.dataGridViewTipoColisoes.CurrentRow.Index];
                this.textBoxId.Text = tipo.idTipoColisao.ToString();
                this.textBoxColisao.Text = tipo.colisao;
                this.checkBoxPermitido.Checked = tipo.permitido;
                this.trackBarX.Value = tipo.avariaX;
                this.trackBarY.Value = this.trackBarY.Maximum - tipo.avariaY;
                this.ovalShape1.Left = tipo.avariaX;
                this.ovalShape1.Top = tipo.avariaY;
                this.ovalShape1.Width = tipo.avariaWidth;
                this.ovalShape1.Height = tipo.avariaHeight;
            }
            if (novo || edit){
                this.textBoxColisao.Focus();
            }
        }

        private void trackBarY_Scroll(object sender, EventArgs e)
        {
            this.ovalShape1.Top = this.trackBarY.Maximum - this.trackBarY.Value;
        }
        private void trackBarX_Scroll(object sender, EventArgs e)
        {
            this.ovalShape1.Left = this.trackBarX.Value;
        }
        private void buttonAumentar_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Width = Math.Min(150, this.ovalShape1.Width + 5);
            this.ovalShape1.Height = Math.Min(250, this.ovalShape1.Height + 5);
        }
        private void buttonDiminuir_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Width = Math.Max(10, this.ovalShape1.Width - 5);
            this.ovalShape1.Height = Math.Max(10, this.ovalShape1.Height - 5);
        }
        private void buttonEsticarDir_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Width = Math.Min(150, this.ovalShape1.Width + 5);
        }
        private void buttonEsticarBaixo_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Height = Math.Min(250, this.ovalShape1.Height + 5);
        }
        private void buttonEncolherDir_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Width = Math.Max(10, this.ovalShape1.Width - 5);
        }
        private void buttonEncolherBaixo_Click(object sender, EventArgs e)
        {
            this.ovalShape1.Height = Math.Max(10, this.ovalShape1.Height - 5);
        }

        private void buttonListagem_Click(object sender, EventArgs e)
        {
            FormReportTipoColisao formx = new FormReportTipoColisao();
            formx.MdiParent = this.MdiParent;
            formx.Show();
        }

     }
}
